/***********************************************************************************
 * 文件名： cled_ctrl_static.c
 * 版本�?1
 * 说明�?
 * 		彩色LED控制器。按照指令控制彩色LED做一些动作。静态定义意味着只支�?个LED，多个LED�?
 *  使用 cled_ctrl 组件�?
 *      在合适的地方调用 CLEDC_CtrlLoop 确保其间�?0ms左右会被执行一次，比如加入�?
 *  Polsys_lite 的任务列表，如果使用的是 Polsys 就不需要再做这项工作，本文件已经创建了任务�?
 *  但是需要在程序启动时调�?CLEDC_Init() 用于创建任务�?
 *      通过 CLEDC_SetColor 设置颜色�?CLEDC_SetAction 设置动作�?CLEDC_GetAction 可以�?
 *  取当前的动作，一般用来判断是否为 CLEDC_ACT_NULL ，即是否空闲�?
 *      在文�?cled_ctrl_config.h 进行正确的配置�?
 * 修改记录�?
 * 	2021/04/21: 初版�?刘言�?
***********************************************************************************/
#include "cpt-cled_ctrl_static.h"
#include "polsys.h"

// 属性定�?

u8 _CLEDC_ColorR;
u8 _CLEDC_ColorG;
u8 _CLEDC_ColorB;
static u8 CLEDC_mTime;
static u8 CLEDC_mCount;

cled_action_t _CLEDC_Action;
u16 _CLEDC_ActionValue;

// 定义一个任务，
#ifdef POLSYS_LITE
#else
static pdata polsys_task_t mTask;
#endif

// 内部函数申明

static void SetBrightness(u8 b);

// 对外接口函数

#ifndef POLSYS_LITE
void CLEDC_CtrlLoop();
// 初始�?
void CLEDC_Init()
{
    Polsys_TaskInit(&mTask, CLEDC_CtrlLoop, 10);
}
#endif

void CLEDC_SetAction(cled_action_t action, u16 action_value)
{
    if (action == CLEDC_ACT_GRA_COLOR || action == CLEDC_ACT_FLASH)
    {
        CLEDC_mTime = 0;
    }
    _CLEDC_Action = action;
    _CLEDC_ActionValue = action_value;
    _CLEDC_EventActSetted();
}

// 任务入口�?0ms循环执行
void CLEDC_CtrlLoop()
{
    if (_CLEDC_Action == CLEDC_ACT_ON)
    {
        if (_CLEDC_ActionValue > 0)
        {
            _CLEDC_ActionValue--;
            SetBrightness(255);
        }
        else
        {
            _CLEDC_Action = CLEDC_ACT_OFF;
        }
    }
    else if (_CLEDC_Action == CLEDC_ACT_OFF)
    {
        SetBrightness(0);
        _CLEDC_Action = CLEDC_ACT_WAIT;
    }
    else if (_CLEDC_Action == CLEDC_ACT_FLASH)
    {
        if (CLEDC_mTime < 20)
            SetBrightness(0);
        else if (CLEDC_mTime < 40)
            SetBrightness(255);
        else
        {
            CLEDC_mTime = 0;
            _CLEDC_ActionValue--;
            if (_CLEDC_ActionValue == 0)
                _CLEDC_Action = CLEDC_ACT_OFF;
        }
        CLEDC_mTime++;
    }
    else if (_CLEDC_Action == CLEDC_ACT_GRA_ON)
    {
        if (_CLEDC_ActionValue > 0) // 亮的时间
        {
            _CLEDC_ActionValue--;
            if (CLEDC_mCount < 250)
                CLEDC_mCount += 5;
            SetBrightness(CLEDC_mCount);
        }
        else
        {
            _CLEDC_Action = CLEDC_ACT_GRA_OFF;
        }
    }
    else if (_CLEDC_Action == CLEDC_ACT_GRA_OFF)
    {
        if (CLEDC_mCount >= 5)
            CLEDC_mCount -= 5;
        else
        {
            _CLEDC_Action = CLEDC_ACT_OFF;
            CLEDC_mCount = 0;
        }
        SetBrightness(CLEDC_mCount);
    }
    else if (_CLEDC_Action == CLEDC_ACT_BREATH)
    {
        if (_CLEDC_ActionValue > 0)
        {
            _CLEDC_ActionValue--;
            if (CLEDC_mTime)
            {
                if (CLEDC_mCount <= 250)
                    CLEDC_mCount += 5;
                else
                    CLEDC_mTime = 0;
            }
            else
            {
                if (CLEDC_mCount >= 5)
                    CLEDC_mCount -= 5;
                else
                    CLEDC_mTime = 1;
            }
            SetBrightness(CLEDC_mCount);
        }
        else
        {
            _CLEDC_Action = CLEDC_ACT_GRA_OFF;
        }
    }
#ifdef _CLEDC_USE_GRA_COLOR
    else if (_CLEDC_Action == CLEDC_ACT_GRA_COLOR)
    {
        if (_CLEDC_ActionValue > 0)
        {
            _CLEDC_ActionValue--;
            // 保证执行一次，通知亮度改变
            if (CLEDC_mTime == 0)
            {
                CLEDC_mTime = 1;
                _CledC_SetBrightnessHook(0);
                CLEDC_mCount = 0; // 从R++开始
            }
            else if (CLEDC_mCount == 0) //R++
            {
                _CLEDC_ColorG = 0;
                _CLEDC_ColorB = 0;
                if (_CLEDC_ColorR < 214)
                    _CLEDC_ColorR++;
                else
                    CLEDC_mCount = 1;
            }
            else if (CLEDC_mCount == 1) //步骤1：G++
            {
                if (_CLEDC_ColorG < 214)
                    _CLEDC_ColorG++;
                else
                    CLEDC_mCount = 2;
            }
            else if (CLEDC_mCount == 2) //步骤2：R--
            {
                if (_CLEDC_ColorR > 0)
                    _CLEDC_ColorR--;
                else
                    CLEDC_mCount = 3;
            }
            else if (CLEDC_mCount == 3) //步骤3：B++
            {
                if (_CLEDC_ColorB < 214)
                    _CLEDC_ColorB++;
                else
                    CLEDC_mCount = 4;
            }
            else if (CLEDC_mCount == 4) //步骤4：G--
            {
                if (_CLEDC_ColorG > 0)
                    _CLEDC_ColorG--;
                else
                    CLEDC_mCount = 5;
            }
            else if (CLEDC_mCount == 5) //步骤5：R++
            {
                if (_CLEDC_ColorR < 214)
                    _CLEDC_ColorR++;
                else
                    CLEDC_mCount = 6;
            }
            else //步骤6：B--
            {
                if (_CLEDC_ColorB > 0)
                    _CLEDC_ColorB--;
                else
                    CLEDC_mCount = 1;
            }
            _CledC_SetValue(_CLEDC_ColorR, _CLEDC_ColorG, _CLEDC_ColorB);
        }
        else
        {
            _CLEDC_Action = CLEDC_ACT_GRA_OFF;
        }
    }
#endif
    else if (_CLEDC_Action == CLEDC_ACT_WAIT)
    {
        _CLEDC_Action = CLEDC_ACT_NULL;
        _CLEDC_EventActNull();
    }
    else
    {
        _CLEDC_Action = CLEDC_ACT_NULL;
        CLEDC_mCount = 0;
        CLEDC_mTime = 0;
    }
}

// 内部函数

// 设置实时亮度
static void SetBrightness(u8 brightness)
{
    u8 r, g, b;
    r = (u16)_CLEDC_ColorR * brightness / 256;
    g = (u16)_CLEDC_ColorG * brightness / 256;
    b = (u16)_CLEDC_ColorB * brightness / 256;
    _CledC_SetValue(r, g, b);
    _CledC_SetBrightnessHook(brightness);
}
